/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Nivel;

import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import util.ErroAcessoRepositorioException;
import util.HibernateUtil;

/**
 *
 * @author Tulio José
 * @author Alberto Medeiros
 */
public class RepositorioNivel implements IRepositorioNivel {

    private static final String MSG_ERRO_ACESSO__BD = "Erro de acesso ao banco de dados";

    public RepositorioNivel() throws ErroAcessoRepositorioException {
    }
    
    /**
     * Método que ira cadastrar / Atualizar o objNivel na base
     * 
     * @param objNivel
     * @throws ErroAcessoRepositorioException 
     */
    public void cadastrarAtualizar(Nivel objNivel) throws ErroAcessoRepositorioException {
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            // Salvando / Atualizando o nivel
            s.saveOrUpdate(objNivel);
            t.commit();

        } catch (Exception e) {
            t.rollback();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }


    }

    /**
     * Metodo que ira produrar o nivel
     *
     * @param int idDescricaoProduto
     * @return void
     */
    public Nivel procurar(int idNivel) throws NivelNaoCadastradoException, ErroAcessoRepositorioException {
        Nivel objNivel = null;
        if (this.existe(idNivel)) {
            Session s = null;
            Transaction t = null;
            try {
                s = HibernateUtil.getSessionFactory().getCurrentSession();
                t = s.beginTransaction();
                // Procurando na base
                objNivel = (Nivel) s.get(Nivel.class, idNivel);
                t.commit();

            } catch (Exception e) {
                t.rollback();
                throw new NivelNaoCadastradoException();
            }
        } else {
            throw new NivelNaoCadastradoException("Nivel Não Cadastrado");
        }
        return objNivel;
    }
    
    /**
     * Metodo que ira listar os Categorias
     *
     * @return Collection
     */
    public List<Nivel> procurarPorDescricaoPorSubSetor(String descricaoNivel, int idSubSetor) throws Exception, ErroAcessoRepositorioException {
        List<Nivel> listNivel = null;
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            // criando o sql
            String sql = "from Nivel  WHERE id_nivel IS NOT NULL AND status_nivel = true  ";
            if(descricaoNivel.trim().length() > 0){
                sql += " AND descricao_nivel LIKE :descricao_nivel ";
            }
            if(idSubSetor > 0){
                sql += " AND id_sub_setor = :id_sub_setor ";
            }
            // Criando a query
            Query q = s.createQuery(sql);
            if(descricaoNivel.trim().length() > 0){
                q.setParameter("descricao_nivel", "%" + descricaoNivel + "%");
            }
            if(idSubSetor > 0){
                q.setParameter("id_sub_setor", idSubSetor);
            }
            
            // Listando as categorias
            listNivel = q.list();
            
            t.commit();
            
        } catch (Exception e) {
            t.rollback();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }
        return listNivel;
    }
    
    /**
     * Método que ira verificar a existencia de um determinado objeto
     * 
     * @param idNivel
     * @return
     * @throws ErroAcessoRepositorioException 
     */
    public boolean existe(int idNivel) throws ErroAcessoRepositorioException{
        Nivel objNivel = null;
        Session  s= null ;
        Transaction t = null;
        
        try {
            s= HibernateUtil.getSessionFactory().getCurrentSession();
            t=s.beginTransaction();
            // Procurando na base
            objNivel = (Nivel) s.get(Nivel.class, idNivel);
            t.commit();
        } catch (Exception e) {
            t.rollback();
        }
        
        return (objNivel !=null);
    }

    public List<Nivel> listar(String strComplemento) throws Exception, ErroAcessoRepositorioException{
        List<Nivel> listNivel = null;
        Session  s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t= s.beginTransaction();
            // Listando na Base
            Query q = s.createQuery("from Nivel  WHERE id_nivel IS NOT NULL " + strComplemento);
            // Add o resujltado a um List
            listNivel = q.list();

            // Comintando as transações
            t.commit();
        } catch (Exception e) {
            t.rollback();
            throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO__BD, null,1);
        }
        return listNivel;
    }
    
    public List<Nivel> listarAtivos() throws Exception, ErroAcessoRepositorioException{
        String complemento = " AND status_nivel = true ORDER BY id_nivel";
        return this.listar(complemento);
    }
    
    public void remover(int idNivel) throws NivelNaoCadastradoException, ErroAcessoRepositorioException{
        Nivel objNivel =  null;
        if (this.existe(idNivel)){
            Session s = null;
            Transaction t = null;
            try {
                s=HibernateUtil.getSessionFactory().getCurrentSession();
                t= s.beginTransaction();
                //recuperando a descrição do produto
                objNivel = (Nivel) s.get(Nivel.class, idNivel);
                //setar o id como excluido
                objNivel.setStatusNivel(false);
                // Comitandos as Transações
                t.commit();
                //atualizar para excluido
                this.cadastrarAtualizar(objNivel);
            } catch (Exception e) {
                throw new NivelNaoCadastradoException();
            }
                    
        }else{
            throw new NivelNaoCadastradoException();
        }
               
    }
}// Fim da classe